home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The 640 MEG Shareware Studio 2
/
The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO
/
clang
/
nn.zip
/
PATCH10
< prev
next >
Wrap
Text File
|
1989-12-31
|
46KB
|
1,791 lines
This is patch 10 for nn release 6.3
This is primarily a "new features" release, but it also fixes some
bugs (low priority ones).
BUGS FIXED
----------
The tables in the online manual are now properly aligned.
A core dump when viewing empty articles have been fixed (thanks to
Sjoerd Mullender).
Type-ahead will now be flushed when entering a new group (since you
don't know which group it is, nor which articles are in it, what would
you type-ahead anyway?)
Number of killed articles on the menu is now updated when you kill
articles with the K command.
The `Y' {overview} command now marks groups with an entry macro with a
% after the name.
The entry macro is no longer executed again after a goto-group command
completes. You can now use local variables described below instead.
The nncheck -t output format is now similar to the output from the `Y'
command (but only one column).
Specifying `comp.' in the presentation sequence no longer (falsely)
includes `comp' (bad example, since there is no comp group, but I hope
you get the idea).
Variable name completion now works for no"name.." also.
NEW FEATURES
------------
The variables can now be assigned local values which are only
effective until the current group is left. A variable is made local
using the :local command, e.g.
:local cross-post
A new value can be assigned to the local variable in the same command:
:local cross-post on
:local auto-preview-mode off
:local default-save-file +src/$L/misc
Local variables are marked with a '>' in front of the name when
displayed with the :set command.
This can be combined with a new "on group groups..." construction:
on group comp.sources* alt.sources
:local kill off
end
This allows you to specify entry macros for several groups without
disrupting the presentation sequence.
$(VAR) can now be specified in file names - it is expanded into the
value of the environment variable VAR. For example, you can specify
this in the global init file (provided every user has a MAIL variable
set):
set mail $(MAIL)
There is a new "Auto Preview Mode" where hitting the article id letter
immediately enters preview mode rather than selecting the article. It
is enabled by setting the auto-preview-mode variable.
There are new options to nnmaster:
-B Remove bad articles from the spool directory
-b Do not ignore bad articles.
-Ltypes Do not write entries of the specified types in the log file.
There is a new confirm-create variable that will cause nn to wait for
confirmation before creating new files.
TO APPLY:
Feed this patch through the "patch" program.
*** /usr/storm/nn6.3.9/patchlevel.h Fri Oct 20 23:24:42 1989
--- patchlevel.h Thu Oct 26 12:46:09 1989
***************
*** 29,35 ****
*
* 1989-09-15: Patch 8: pack_name.c nntp.c
* 1989-10-20: Patch 9: several files
*/
! #define PATCHLEVEL 9
--- 29,36 ----
*
* 1989-09-15: Patch 8: pack_name.c nntp.c
* 1989-10-20: Patch 9: several files
+ * 1989-11-17: Patch 10: several files
*/
! #define PATCHLEVEL 10
*** /usr/storm/nn6.3.9/answer.c Fri Oct 20 23:24:44 1989
--- answer.c Thu Nov 16 15:39:21 1989
***************
*** 281,287 ****
return 2;
}
} else {
! prompt("Confirm cancel: '%.50s'", ah->subject ? ah->subject : "");
if (yes(1) <= 0) return 1;
}
--- 281,289 ----
return 2;
}
} else {
! prompt("Confirm cancel: '%s: %.30s'",
! ah->sender ? ah->sender : "",
! ah->subject ? ah->subject : "");
if (yes(1) <= 0) return 1;
}
*** /usr/storm/nn6.3.7/articles.h Fri Sep 8 12:46:41 1989
--- articles.h Tue Oct 24 10:11:54 1989
***************
*** 7,15 ****
article_number n_articles;
article_header **articles;
- /* number of articles killed by last access_group call */
-
- int killed_articles;
typedef struct thunk {
char *this_thunk;
--- 7,12 ----
*** /usr/storm/nn6.3.7/collect.c Fri Sep 8 12:46:41 1989
--- collect.c Tue Oct 31 18:27:59 1989
***************
*** 4,9 ****
--- 4,12 ----
#define COUNT_RE_REFERENCES /* no of >>> depends on Reference: line */
+ export int ignore_bad_articles = 1; /* no Newsgroups: line */
+ export int remove_bad_articles = 0;
+
import int trace;
***************
*** 128,134 ****
* it is not really necessary to save anything in the data file
* we simply use the index file to get the *first* available article
*/
! return 1; /* but we have still collected one article */
}
/* map cross-postings into a list of group numbers */
--- 131,151 ----
* it is not really necessary to save anything in the data file
* we simply use the index file to get the *first* available article
*/
! return 0;
! }
!
! if (ignore_bad_articles && news.ng_groups == NULL) {
! char *rem = "";
!
! #ifndef NNTP
! if (remove_bad_articles) {
! unlink(group_path_name);
! rem = "removed ";
! }
! #endif NNTP
! log_entry('B', "%sbad article: %s/%ld", rem,
! current_group->group_name, (long)art_num);
! return 0;
}
/* map cross-postings into a list of group numbers */
*** /usr/storm/nn6.3.9/folder.c Fri Oct 20 23:24:47 1989
--- folder.c Fri Nov 17 18:51:47 1989
***************
*** 65,70 ****
--- 65,86 ----
}
+ if (c == '$' && src[1] == '(') {
+ char envar[64];
+ for (src += 2, cp = envar; (c = *src) != NUL && c != ')'; src++)
+ *cp++ = c;
+ *cp = NUL;
+ if (cp != envar) {
+ if ((cp = getenv(envar)) != NULL)
+ while (*cp) *dp++ = *cp++;
+ else {
+ msg("Environment variable $(%d) not set", envar);
+ return 0;
+ }
+ }
+ goto no_parse;
+ }
+
if (c == '$' && !isalnum(src[2])) {
remap = 0;
cp = NULL;
*** /usr/storm/nn6.3.9/global.c Fri Oct 20 23:24:47 1989
--- global.c Fri Nov 3 08:45:11 1989
***************
*** 8,13 ****
--- 8,14 ----
export char news_directory[] = NEWS_DIRECTORY; /* /usr/spool/news */
export char lib_directory[] = LIB_DIRECTORY; /* /usr/local/lib/nn */
export char db_directory[] = DB_DIRECTORY; /* /usr/spool/nn */
+ export char *log_entry_filter = NULL;
export char *temp_file;
***************
*** 479,484 ****
--- 480,489 ----
{
FILE *log;
char *msg, buf[512], logname[512];
+
+ if (log_entry_filter != NULL)
+ for (msg = log_entry_filter; *msg; msg++)
+ if (*msg == type) return 1;
msg = va_arg1(char *);
vsprintf(buf, msg, va_args2toN);
*** /usr/storm/nn6.3.7/group.c Fri Sep 8 12:46:43 1989
--- group.c Tue Oct 24 10:11:54 1989
***************
*** 21,26 ****
--- 21,27 ----
import int article_limit, also_read_articles;
import int no_update;
import int merged_menu;
+ import int killed_articles;
char *quick_match();
***************
*** 277,283 ****
if ((subpattern && !regexec(subpattern, ah->subject)) ||
(submask && quick_match(ah->subject, submask) == NULL) ||
(do_kill && kill_article(ah))) {
- killed_articles++;
release_str(&str_marker);
goto read_next;
}
--- 278,283 ----
***************
*** 371,377 ****
o_first_article = current_first_article;
o_killed = killed_articles;
mark_memory(&sel_marker);
!
if (init_group(gh) <= 0) menu_return( ME_NEXT );
m_invoke(-1);
--- 371,378 ----
o_first_article = current_first_article;
o_killed = killed_articles;
mark_memory(&sel_marker);
! mark_var_stack();
!
if (init_group(gh) <= 0) menu_return( ME_NEXT );
m_invoke(-1);
***************
*** 513,518 ****
--- 514,520 ----
current_first_article = o_first_article;
killed_articles = o_killed;
+ restore_variables();
return menu_cmd;
}
***************
*** 844,850 ****
if (gh != orig_group) {
current_first_article = o_current_first;
! if (orig_group) { init_group(orig_group); m_invoke(-1); }
}
goto_exit:
--- 846,852 ----
if (gh != orig_group) {
current_first_article = o_current_first;
! if (orig_group) init_group(orig_group);
}
goto_exit:
***************
*** 993,999 ****
(long)(gh->last_l_article - gh->last_article),
(gh == current_group) ? '*' : ' ',
gh->group_name,
! gh->group_flag & G_SUBSCRIPTION ? "" : " (!)");
return 0;
}
--- 995,1002 ----
(long)(gh->last_l_article - gh->last_article),
(gh == current_group) ? '*' : ' ',
gh->group_name,
! (gh->group_flag & G_SUBSCRIPTION) == 0 ? " (!)" :
! gh->enter_macro ? " %" : "");
return 0;
}
*** /usr/storm/nn6.3.9/init.c Fri Oct 20 23:24:49 1989
--- init.c Fri Nov 3 16:01:39 1989
***************
*** 212,217 ****
--- 212,218 ----
"decode", 6, 0,
"define", 6, 0,
"help", 4, 2,
+ "local", 5, 3,
"man", 3, 0,
"map", 3, -1,
"map both", 8, 4,
***************
*** 219,224 ****
--- 220,226 ----
"map menu", 8, 4,
"map show", 8, 4,
"mkdir", 5, 1,
+ "patch", 5, 0, /* QUICK HACK */
"print", 5, 0, /* QUICK HACK */
"pwd", 3, 0,
"rmail", 5, 0,
***************
*** 403,408 ****
--- 405,411 ----
FILE *initf;
{
extern char *m_define(), *parse_enter_macro();
+ int i;
if (!split_command(cmd)) return ok_val;
***************
*** 427,432 ****
--- 430,447 ----
return ok_val;
}
+ CASE( "local" ) {
+ if (ARGTAIL == NULL) goto stx_err;
+
+ cmd = argv(1);
+ if (!push_variable(cmd)) return ok_val;
+
+ if (ARGTAIL && set_variable(cmd, 1, ARGTAIL))
+ return AC_REDRAW;
+ else
+ return ok_val;
+ }
+
CASE( "set" ) {
if (ARGTAIL == NULL) {
disp_variables();
***************
*** 856,862 ****
if (code != K_INVALID) {
menu_key_map[parse_key(argv(2))] = code;
! return;
}
}
--- 871,877 ----
if (code != K_INVALID) {
menu_key_map[parse_key(argv(2))] = code;
! if (!map_show) return;
}
}
***************
*** 910,917 ****
CASE( "entry" ) {
import char *dflt_enter_macro;
!
! dflt_enter_macro = parse_enter_macro(f, NL);
break;
}
--- 925,943 ----
CASE( "entry" ) {
import char *dflt_enter_macro;
! group_header *gh, *get_group_search();
! char *macro;
! int i;
!
! macro = parse_enter_macro(f, NL);
! if (ARGTAIL) {
! for (i = 2; argv(i); i++) {
! start_group_search(argv(i));
! while (gh = get_group_search())
! gh->enter_macro = macro;
! }
! } else
! dflt_enter_macro = macro;
break;
}
*** /usr/storm/nn6.3.9/kill.c Fri Oct 20 23:24:51 1989
--- kill.c Tue Oct 24 10:11:54 1989
***************
*** 6,11 ****
--- 6,13 ----
* kill file handling
*/
+ export int killed_articles;
+
char KILL_FILE[] = "kill";
char COMPILED_KILL[] = "KILL.COMP";
***************
*** 94,102 ****
if (quick_match(string, kl->kill_pattern) == NULL)
continue;
! if (kl->kill_flag & AUTO_KILL)
return 1;
!
ah->flag |= A_SELECT | A_AUTO;
break;
}
--- 96,106 ----
if (quick_match(string, kl->kill_pattern) == NULL)
continue;
! if (kl->kill_flag & AUTO_KILL) {
! killed_articles++;
return 1;
! }
!
ah->flag |= A_SELECT | A_AUTO;
break;
}
***************
*** 145,150 ****
--- 149,155 ----
} else
if (quick_match(string, kl->kill_pattern) == NULL)
continue;
+ killed_articles++;
return 1;
}
*** /usr/storm/nn6.3.7/macro.c Fri Sep 8 12:46:46 1989
--- macro.c Fri Nov 3 16:01:39 1989
***************
*** 212,218 ****
if (*lp == ':') {
lp++;
if (initial_set_commands) {
! if (!strncmp(lp, "set", 3) || !strncmp(lp, "unset", 5)) {
m_new(M_SET_COMMAND);
m->m_string = copy_str(lp);
break;
--- 212,220 ----
if (*lp == ':') {
lp++;
if (initial_set_commands) {
! if (strncmp(lp, "local", 5) == 0 ||
! strncmp(lp, "set", 3) == 0 ||
! strncmp(lp, "unset", 5) == 0) {
m_new(M_SET_COMMAND);
m->m_string = copy_str(lp);
break;
*** /usr/storm/nn6.3.7/master.c Fri Sep 8 12:46:47 1989
--- master.c Fri Nov 3 08:45:11 1989
***************
*** 20,25 ****
--- 20,27 ----
*
* -E expire by recolleting entire groups rather than copying files
* -C check consistency of database on start-up
+ * -b include 'bad' articles (disables -B)
+ * -B remove 'bad' articles (just unlink the files)
*
* -I initialize
* -t trace collection of each group
***************
*** 26,31 ****
--- 28,34 ----
* -v print version and exit
* -u update even if active is not modified
* -w send wakeup to real master
+ * -Ltypes exclude 'types' entries from the log
* -D debug
*/
***************
*** 44,51 ****
--- 47,59 ----
debug_mode = 0;
import int
+ ignore_bad_articles,
+ remove_bad_articles,
retry_on_error;
+ import char
+ *log_entry_filter;
+
export int
trace = 0,
#ifdef NNTP
***************
*** 69,75 ****
--- 77,86 ----
'E', Bool_Option( clean_to_expire ),
'C', Bool_Option( check_on_startup ),
+ 'b', Bool_Option( ignore_bad_articles ),
+ 'B', Bool_Option( remove_bad_articles ),
+ 'L', String_Option( log_entry_filter ),
'D', Bool_Option( debug_mode ),
't', Bool_Option( trace ),
*** /usr/storm/nn6.3.9/menu.c Fri Oct 20 23:24:53 1989
--- menu.c Thu Nov 9 12:36:36 1989
***************
*** 19,25 ****
export int slow_mode = 0; /* mark selected articles with *s */
export int re_layout = 0; /* Re: format presentation on menus */
export int collapse_subject = 25; /* collapse long subjects at position */
! export int conf_group_entry = 0; /* ask whether group should be entered */
export char *delayed_msg = NULL; /* give to msg() after redraw */
export long dl_msg_arg = 0; /* optional arg to delayed_msg */
--- 19,26 ----
export int slow_mode = 0; /* mark selected articles with *s */
export int re_layout = 0; /* Re: format presentation on menus */
export int collapse_subject = 25; /* collapse long subjects at position */
! export int conf_group_entry = 0; /* ask whether group should be entered */
! export int auto_preview_mode = 0; /* preview rather than select */
export char *delayed_msg = NULL; /* give to msg() after redraw */
export long dl_msg_arg = 0; /* optional arg to delayed_msg */
***************
*** 58,63 ****
--- 59,65 ----
#define REMOVE 5
#define CANCEL 6
#define ON_LEAVE 7
+ #define ON_READ 8
static int how;
***************
*** 122,127 ****
--- 124,135 ----
putchar((ah->flag & A_CANCEL) ? '#' : ' ');
return;
+ case ON_READ:
+ if (cura < 0 || cura > numa) return;
+ gotoxy(1, lno);
+ putchar((ah->flag & A_READ) ? '.' : ' ');
+ return;
+
case ON_LEAVE:
if (cura < 0 || cura > numa) return;
gotoxy(1, lno);
***************
*** 314,320 ****
char *fmt;
if (first <= start || n <= 0)
! if (last >= end)
return "All";
else
fmt = "Top %d%%";
--- 322,328 ----
char *fmt;
if (first <= start || n <= 0)
! if (last >= end || n <= 0)
return "All";
else
fmt = "Top %d%%";
***************
*** 352,357 ****
--- 360,367 ----
#define menu_return(cmd) \
{ menu_cmd = (cmd); goto menu_exit; }
+ flush_input();
+
o_firsta = firsta;
o_mode = in_menu_mode;
in_menu_mode = 1;
***************
*** 876,881 ****
--- 886,893 ----
case K_ARTICLE_ID:
if (numa < 0) goto nextmenu;
+ if (auto_preview_mode) goto auto_preview;
+
cura = article_id;
how = TOGGLE;
mark();
***************
*** 1057,1070 ****
article_id = cura;
}
temp = prompt_line;
preview_next:
! ah = articles[firsta+article_id];
! cura = article_id + 1;
no_raw();
! switch (more(ah, MM_PREVIEW, prompt_line)) {
case MC_DO_KILL:
if (!do_auto_kill()) break;
--- 1069,1090 ----
article_id = cura;
}
+ auto_preview:
temp = prompt_line;
preview_next:
! cura = article_id;
! ah = articles[firsta+cura];
no_raw();
! menu_cmd = more(ah, MM_PREVIEW, prompt_line);
! if (auto_preview_mode && ah->flag & A_READ && prompt_line >= 0) {
! how = ON_READ;
! mark();
! }
! next_cura = ++cura;
!
! switch (menu_cmd) {
case MC_DO_KILL:
if (!do_auto_kill()) break;
***************
*** 1084,1096 ****
do_auto_select((regexp *)NULL, 2);
/* FALL THRU */
- case MC_REDRAW:
- next_cura = cura;
- goto redraw;
-
- case MC_NO_REDRAW:
- break;
-
case MC_QUIT:
menu_return( ME_QUIT );
--- 1104,1109 ----
***************
*** 1103,1108 ****
--- 1116,1123 ----
case MC_PREVIEW_NEXT:
if (prompt_line < 0) { /* redrawn screen ! */
if ((firsta + cura) >= n_articles) goto redraw;
+ if (auto_preview_mode &&
+ (articles[firsta+cura]->flag & A_SAME) == 0) goto redraw;
prompt_line = Lines;
} else {
if (ah->flag & (A_LEAVE | A_LEAVE_NEXT)) {
***************
*** 1112,1117 ****
--- 1127,1134 ----
cura++;
}
if (cura > numa) break;
+ if (auto_preview_mode &&
+ (articles[firsta+cura]->flag & A_SAME) == 0) break;
prompt_line = temp;
}
article_id = cura;
***************
*** 1123,1128 ****
--- 1140,1146 ----
goto preview_other;
default:
+ if (prompt_line < 0) goto redraw;
break;
}
*** /usr/storm/nn6.3.9/more.c Fri Oct 20 23:24:55 1989
--- more.c Thu Nov 9 12:27:23 1989
***************
*** 18,23 ****
--- 18,24 ----
import int preview_window;
import int novice;
import int slow_mode;
+ import int auto_preview_mode;
import char *delayed_msg;
import long dl_msg_arg;
***************
*** 1093,1105 ****
if ((mode & MM_PREVIEW) && more_cmd != MC_QUIT) {
gotoxy(0, screen_offset);
clrpage(screen_offset);
! if (more_cmd == MC_PREVIEW_NEXT ||
! more_cmd == MC_DO_SELECT || more_cmd == MC_DO_KILL) {
! if (screen_offset == 0) prompt_line = -1;
! } else {
! if (screen_offset == 0) return MC_REDRAW;
! if (more_cmd != MC_PREVIEW_OTHER) return MC_NO_REDRAW;
}
}
return more_cmd;
--- 1094,1105 ----
if ((mode & MM_PREVIEW) && more_cmd != MC_QUIT) {
gotoxy(0, screen_offset);
clrpage(screen_offset);
! if (auto_preview_mode) {
! if ((ah->flag & (A_LEAVE | A_LEAVE_NEXT)) == 0)
! ah->flag |= A_READ;
! if (more_cmd == MC_NEXT) more_cmd = MC_PREVIEW_NEXT;
}
+ if (screen_offset == 0) prompt_line = -1;
}
return more_cmd;
*** /usr/storm/nn6.3.7/nn.c Fri Sep 8 12:46:50 1989
--- nn.c Sun Oct 22 20:43:11 1989
***************
*** 117,133 ****
init_key_map();
init_execute();
init_macro();
#ifdef NNTP
nntp_check();
#endif
if (enter_admin_mode) {
if (argc == 1) {
init_term();
visit_init_file(0);
}
- open_master(OPEN_READ);
- visit_active_file();
admin_mode(argv[1]);
nn_exit(0);
}
--- 117,133 ----
init_key_map();
init_execute();
init_macro();
+ open_master(OPEN_READ);
#ifdef NNTP
nntp_check();
#endif
if (enter_admin_mode) {
+ visit_active_file();
if (argc == 1) {
init_term();
visit_init_file(0);
}
admin_mode(argv[1]);
nn_exit(0);
}
***************
*** 151,158 ****
print_version("Release %R.%V.%P #%U, Kim F. Storm, 1989\n\n");
}
- open_master(OPEN_READ);
-
if (also_read_articles) {
if (article_limit < 0)
article_limit = also_read_articles;
--- 151,156 ----
*** /usr/storm/nn6.3.9/nn.1 Fri Oct 20 23:24:58 1989
--- nn.1 Fri Nov 17 19:16:23 1989
***************
*** 903,909 ****
|| cd ~/src/nn ; patch
.br
.LP
! The following symbols are expanded in a file name:
.TP
.B $F
will be expanded to the name of the current group with the periods
--- 903,909 ----
|| cd ~/src/nn ; patch
.br
.LP
! The following symbols are expanded in a file name or command:
.TP
.B $F
will be expanded to the name of the current group with the periods
***************
*** 920,925 ****
--- 920,927 ----
.B $N
will be expanded to the (local) article number, e.g. 1099. In
selection mode it is only allowed at the end of the file name!
+ .B $(VAR)
+ is replaced by the string value of the environment variable \fIVAR\fP.
.LP
Using these symbols, a simple naming scheme for `default folder name' is
.B +$G
***************
*** 1429,1434 ****
--- 1431,1439 ----
.TP
.B %
Same as $A.
+ .TP
+ .B $(VAR)
+ is replaced by the string value of the environment variable \fIVAR\fP.
.LP
When the shell command is completed, you will be asked to hit any key
to continue. If you hit the
***************
*** 1523,1528 ****
--- 1528,1540 ----
Provide online help on the specified subject. If you omit the
subject, a list of the available topics will be given.
.TP
+ \fB:local\fP \fIvariable\fP [ \fIvalue\fP ]
+ Make the variable local to the current group. Subsequent changes to
+ the variable will only be effective until the current group is left.
+ If a value is specified, it will be assigned to the local variable.
+ To assign a new value to a boolean variable, the values \fBon\fP and
+ \fBoff\fP must be used.
+ .TP
\fB:man\fP
Call up the online manual. The manual is presented as a normal folder
with the program name in the `From' field and the section title in the
***************
*** 1712,1717 ****
--- 1724,1740 ----
.B :set
command without arguments.
.LP
+ Variables are global by default, but a local instantiation of the
+ variable can be created using the \fB:local\fP command. The local
+ variable will overlay the global variable as long as the current group
+ is active, i.e. the global variable will be used again when you exit
+ the current group. The initial value of the local variable will be
+ the same as the global variable, unless a new value is specified in
+ the \fB:local\fP command:
+ .sp 0.5v
+ \fB:local\fP \fIvariable\fP [ \fIvalue\fP ]
+ .sp 0.5v
+ .LP
The following variables are available:
.TP
\fBalso-subgroups\fP (boolean, default true)
***************
*** 1725,1730 ****
--- 1748,1763 ----
asterisk `*', e.g. comp.unix*, will include the group as well as all
subgroups independently of the setting of \fBalso-subgroups\fP.
.TP
+ \fBauto-preview-mode\fP (boolean, default false)
+ Enables \fIAuto Preview Mode\fP. In this mode, selecting an article
+ on the menu using its article id (letter a-z) will enter preview mode
+ on that article immediately. Furthermore, the `n' {\fBnext-article\fP}
+ command will preview the next article on the menu only if it has the
+ same subject as the current article; otherwise, it will return to the
+ menu with the cursor placed on the next article. The \fBcontinue\fP
+ command at the end of the article and the `=' {\fBgoto-menu\fP}
+ returns to the menu immediately as usual.
+ .TP
\fBbackup\fP (boolean, default true)
Backup the rc file on start-up. Setting
.B backup
***************
*** 1888,1894 ****
when \fInn\fP is prompting for a string, e.g. a file name.
.TP
\fBlayout\fP \fInumber\fP (integer, default 1)
! Set the menu layout. The argument must be a number between 0 and 3.
.TP
\fBlimit\fP \fImax-articles\fP (integer, default infinite)
.I Limit
--- 1921,1927 ----
when \fInn\fP is prompting for a string, e.g. a file name.
.TP
\fBlayout\fP \fInumber\fP (integer, default 1)
! Set the menu layout. The argument must be a number between 0 and 5.
.TP
\fBlimit\fP \fImax-articles\fP (integer, default infinite)
.I Limit
***************
*** 2956,2965 ****
The commands are executed if the TERM environment variable contains
the value specified by \fIterm-type\fP.
.TP
! \fBon entry\fP
.br
These commands (macro format!) are executed every time \fInn\fP enters a
! news group. The `:set' and `:unset' commands at the beginning of the
command group are executed \fIbefore\fP \fInn\fP collects the articles
in the group, so it is possible to set variables like
\fBcross-post\fP. The other commands, and :set/:unset commands that
--- 2989,3004 ----
The commands are executed if the TERM environment variable contains
the value specified by \fIterm-type\fP.
.TP
! \fBon entry\fP [ \fIgroup list\fP ]
.br
These commands (macro format!) are executed every time \fInn\fP enters a
! news group. If a group list is not specified, the commands are
! associated with all groups which don't have its own entry macro
! specified in the group sequence. Otherwise, the entry macro will be
! associated with the groups in the list. The group list is specified
! using the meta-notations described in the presentation sequence section.
! .sp 0.5v
! The `:set', `:unset', and `:local' commands at the beginning of the
command group are executed \fIbefore\fP \fInn\fP collects the articles
in the group, so it is possible to set variables like
\fBcross-post\fP. The other commands, and :set/:unset commands that
***************
*** 2967,2979 ****
\fIafter\fP the first menu page is presented.
.sp 0.5v
.nf
! \fBon entry\fP
! :unset cross-post
\fBend\fP
.fi
- .sp 0.5v
- The `entry' command group is \fInot\fP executed if the group has its
- own entry action specified in the presentation sequence (see below).
.SH GROUP PRESENTATION SEQUENCE
News groups are normally presented in the sequence defined in the
system-wide
--- 3006,3015 ----
\fIafter\fP the first menu page is presented.
.sp 0.5v
.nf
! \fBon entry\fP comp.sources* alt.sources
! :local cross-post on
\fBend\fP
.fi
.SH GROUP PRESENTATION SEQUENCE
News groups are normally presented in the sequence defined in the
system-wide
***************
*** 3097,3103 ****
.TP
\&< group.name
Place the group (and its subgroups) at the beginning of the
! presentation sequence.
.TP
\&> group.name
Place the group (and its subgroups) after all other groups that are
--- 3133,3141 ----
.TP
\&< group.name
Place the group (and its subgroups) at the beginning of the
! presentation sequence. Notice that each `<' entry will place the
! group(s) at the beginning of the current sequence, i.e. < A < B < C
! will generate the sequence C B A.
.TP
\&> group.name
Place the group (and its subgroups) after all other groups that are
*** /usr/storm/nn6.3.7/nnadmin.1m Fri Sep 8 12:46:50 1989
--- nnadmin.1m Thu Nov 16 14:40:25 1989
***************
*** 523,528 ****
--- 523,529 ----
.br
.DT
.ta \w'$db/DATA/\fInnn\fP.dx'u+3m
+ .\"ta 0 16
$db/MASTER Database master index
.br
$db/GROUPS News group names in MASTER file order
*** /usr/storm/nn6.3.7/nncheck.1 Fri Sep 8 12:46:50 1989
--- nncheck.1 Thu Nov 16 14:40:25 1989
***************
*** 57,62 ****
--- 57,63 ----
.sp 0.5v
.DT
.ta 1i 2i
+ .\"ta 4 12
.nf
\fB%-code\fP \fBresulting output\fP
.sp 0.5v
***************
*** 85,90 ****
--- 86,92 ----
.SH FILES
.DT
.ta \w'$db/MASTER'u+6m
+ .\"ta 0 12
~/.nn/rc The record of read articles
.br
$db/MASTER The database master index
*** /usr/storm/nn6.3.7/nngoback.1 Fri Sep 8 12:46:50 1989
--- nngoback.1 Thu Nov 16 14:40:24 1989
***************
*** 64,69 ****
--- 64,70 ----
.SH FILES
.DT
.ta \w'$lib/date_regexp'u+3m
+ .\"ta 0 20
~/.nn/rc The record of read articles.
.br
~/.nn/rc.bak1 The original rc file before goback.
*** /usr/storm/nn6.3.7/nngrep.1 Fri Sep 8 12:46:50 1989
--- nngrep.1 Thu Nov 16 14:40:24 1989
***************
*** 29,34 ****
--- 29,35 ----
.SH FILES
.DT
.ta \w'~/.nn/rc.bak'u+3m
+ .\"ta 0 12
~/.nn/rc The record of read articles
.DT
.SH SEE ALSO
*** /usr/storm/nn6.3.7/nnmaster.1m Fri Sep 8 12:46:51 1989
--- nnmaster.1m Thu Nov 16 14:40:23 1989
***************
*** 17,27 ****
[ \-\fBr [ \fP\fIN\fP ] ]
[ \-\fBe\fP\fIN\fP ]
[ \-\fBy\fP\fIN\fP ]
! [ \-\fBf\fP ]
! [ \-\fBC\fP ]
! [ \-\fBE\fP ]
! [ \-\fBu\fP ]
! [ \-\fBt\fP ]
.SH DESCRIPTION
.I nnmaster
is the daemon which is responsible for building and maintaining the
--- 17,24 ----
[ \-\fBr [ \fP\fIN\fP ] ]
[ \-\fBe\fP\fIN\fP ]
[ \-\fBy\fP\fIN\fP ]
! [ \-\fBL\fP\fItypes\fP ]
! [ \-\fBBbCEfut\fP ]
.SH DESCRIPTION
.I nnmaster
is the daemon which is responsible for building and maintaining the
***************
*** 87,92 ****
--- 84,102 ----
Run \fInnmaster\fP in foreground in daemon mode (see \-\fBr\fP).
Useful if \fInnmaster\fP is invoked from inittab.
.TP
+ .B \-b
+ Normally, articles without a proper news header (no Newsgroups: line)
+ are ignored. Specifying the \-\fBb\fP option causes these `bad'
+ articles to be included in the database (normally with no sender or
+ subject).
+ .TP
+ .B \-B
+ Remove `bad' articles. Sometimes, articles without a header ends up
+ in the news spool directory. These articles have no article id, and
+ therefore, they will never be expired by \fBexpire\fP(8). This option
+ will allow the \fInnmaster\fP to silently remove these articles (a `B'
+ entry will occur in the log file).
+ .TP
\-\fBe\fP \fIart\fP
.br
Run internal
***************
*** 138,143 ****
--- 148,157 ----
keep news for a long time, you should not use the \-E option
without a little thought.
.TP
+ \-\fBL\fP \fItypes\fP
+ Exclude the specified entry types from the log file. This is normally
+ used to exclude the 'C'ollecting and e'X'pire entries (\-\fBL\fPCX).
+ .TP
.B \-I
Initialize database. This option will erase an existing database, and
create an empty database containing entries for the currently known
***************
*** 173,178 ****
--- 187,193 ----
.LP
.DT
.ta \w'$db/DATA/\fInnn\fP.[dx]'u+3m
+ .\"ta 0 20
$db/MASTER Database master index
.br
$db/GROUPS News group names in MASTER file order
*** /usr/storm/nn6.3.7/nntidy.1 Fri Sep 8 12:46:51 1989
--- nntidy.1 Thu Nov 16 14:40:22 1989
***************
*** 17,22 ****
--- 17,23 ----
.SH FILES
.DT
.ta \w'~/.nn/rc.bak'u+3m
+ .\"ta 0 20
~/.nn/rc The record of read articles
.br
~/.nn/rc.bak The original rc file before tidy
*** /usr/storm/nn6.3.7/nnusage.1m Fri Sep 8 12:46:51 1989
--- nnusage.1m Thu Nov 16 14:40:22 1989
***************
*** 23,28 ****
--- 23,29 ----
.SH FILES
.DT
.ta \w'$lib/Log'u+3m
+ .\"ta 0 20
$lib/Log The log file
.DT
.SH SEE ALSO
*** /usr/storm/nn6.3.7/rc.c Fri Sep 8 12:46:54 1989
--- rc.c Sun Oct 22 17:43:54 1989
***************
*** 377,383 ****
n = unread_articles;
add_unread(gh, 1);
if (trace)
! printf("%s: %d\n", gh->group_name, unread_articles - n);
}
}
}
--- 377,383 ----
n = unread_articles;
add_unread(gh, 1);
if (trace)
! printf("%6d %s\n", unread_articles - n, gh->group_name);
}
}
}
*** /usr/storm/nn6.3.9/save.c Fri Oct 20 23:25:04 1989
--- save.c Wed Oct 25 10:23:21 1989
***************
*** 18,23 ****
--- 18,24 ----
export int save_report = 1;
export int quick_save = 0;
export int conf_append = 0;
+ export int conf_create = 1;
export char *save_counter_format = "%d"; /* format of save counter */
***************
*** 241,247 ****
last = strrchr(start, '/');
/* last != NULL => non-existing directories */
! if (!(save_mode & SEPARATE_FILES) || last) {
printf("\rCreate ");
for (np = save_name; *np; np++) {
if (np == start) putchar('\"');
--- 242,248 ----
last = strrchr(start, '/');
/* last != NULL => non-existing directories */
! if (conf_create && (!(save_mode & SEPARATE_FILES) || last)) {
printf("\rCreate ");
for (np = save_name; *np; np++) {
if (np == start) putchar('\"');
*** /usr/storm/nn6.3.7/sequence.c Fri Sep 8 12:46:59 1989
--- sequence.c Wed Oct 25 12:43:06 1989
***************
*** 80,85 ****
--- 80,86 ----
found = 0;
start_group_search(group);
while (gh = get_group_search()) {
+ gh->group_flag |= G_DONE;
if ((gh->group_flag & G_SUBSCRIPTION) == 0 && !also_unsub_groups)
continue;
found++;
***************
*** 311,319 ****
start_group_search(group);
while (gh = get_group_search()) {
gh->save_file = dflt_save;
! gh->enter_macro = enter_macro;
if (group_name_args == 0 &&
(gh->group_flag & G_SUBSCRIPTION) == 0 && !also_unsub_groups)
--- 312,322 ----
start_group_search(group);
while (gh = get_group_search()) {
+ gh->group_flag |= G_DONE;
gh->save_file = dflt_save;
! if (gh->enter_macro == NULL) /* not set by "on entry" */
! gh->enter_macro = enter_macro;
if (group_name_args == 0 &&
(gh->group_flag & G_SUBSCRIPTION) == 0 && !also_unsub_groups)
***************
*** 397,402 ****
--- 400,406 ----
static int gs_length, gs_index, gs_mode;
static group_header *gs_only_group = NULL;
+ #define GS_PREFIX0 0 /* group (or group*) */
#define GS_PREFIX 1 /* group. */
#define GS_SUFFIX 2 /* .group */
#define GS_INFIX 3 /* .group. */
***************
*** 403,409 ****
#define GS_NEW_GROUP 4 /* new group */
#define GS_ALL 5 /* all / . */
! static start_group_search(group)
char *group;
{
char *dot;
--- 407,413 ----
#define GS_NEW_GROUP 4 /* new group */
#define GS_ALL 5 /* all / . */
! start_group_search(group)
char *group;
{
char *dot;
***************
*** 425,431 ****
gs_mode = GS_ALL;
gs_length = 0;
} else {
! gs_mode = GS_PREFIX;
if (strncmp(group, "all.", 4) == 0) group += 3;
--- 429,435 ----
gs_mode = GS_ALL;
gs_length = 0;
} else {
! gs_mode = GS_PREFIX0;
if (strncmp(group, "all.", 4) == 0) group += 3;
***************
*** 433,440 ****
if ((dot = strrchr(group, '.')) != NULL && dot != group) {
if (dot[1] == NUL || strcmp(dot+1, "all") == 0) {
! *dot = NUL;
! if (gs_mode == GS_SUFFIX) gs_mode = GS_INFIX;
}
}
--- 437,444 ----
if ((dot = strrchr(group, '.')) != NULL && dot != group) {
if (dot[1] == NUL || strcmp(dot+1, "all") == 0) {
! dot[1] = NUL;
! gs_mode = (gs_mode == GS_SUFFIX) ? GS_INFIX : GS_PREFIX;
}
}
***************
*** 447,453 ****
}
! static group_header *get_group_search()
{
register group_header *gh;
register int c, tail;
--- 451,457 ----
}
! group_header *get_group_search()
{
register group_header *gh;
register int c, tail;
***************
*** 456,462 ****
gh = gs_only_group;
gs_only_group = NULL;
if (gh->group_flag & (G_DONE | G_NO_DIRECTORY)) return NULL;
- gh->group_flag |= G_DONE;
return gh;
}
--- 460,465 ----
***************
*** 474,481 ****
if ((gh->group_flag & G_NEW) == 0) continue;
break;
! case GS_PREFIX:
if ((c = (gh->group_name)[gs_length]) != NUL && c != '.') continue;
if (strncmp(gh->group_name, gs_group, gs_length)) continue;
break;
--- 477,485 ----
if ((gh->group_flag & G_NEW) == 0) continue;
break;
! case GS_PREFIX0:
if ((c = (gh->group_name)[gs_length]) != NUL && c != '.') continue;
+ case GS_PREFIX:
if (strncmp(gh->group_name, gs_group, gs_length)) continue;
break;
***************
*** 492,499 ****
}
gs_more_groups--;
- gh->group_flag |= G_DONE;
-
return gh;
}
--- 496,501 ----
*** /usr/storm/nn6.3.9/term.c Fri Oct 20 23:25:06 1989
--- term.c Wed Oct 25 10:24:17 1989
***************
*** 688,700 ****
--- 688,708 ----
}
#endif /* CBREAK */
+ static int do_flush_input = 0;
+
flush_input()
{
#ifdef HAVE_TERMIO
ioctl(0, TCFLSH, 0);
+ do_flush_input = 1;
+ #else
+ #ifdef FREAD
+ int arg = FREAD;
+ ioctl(0, TIOCFLUSH, &arg);
#else
ioctl(0, TIOCFLUSH, 0);
#endif
+ #endif
}
int enable_stop = 1;
***************
*** 721,726 ****
--- 729,739 ----
#ifdef KEY_BURST
static char cbuf[KEY_BURST], *cp;
static int n = 0;
+
+ if (do_flush_input) {
+ do_flush_input = 0;
+ n = 0;
+ }
#else
int n;
unsigned char first_key;
*** /usr/storm/nn6.3.9/variable.c Fri Oct 20 23:25:08 1989
--- variable.c Fri Nov 17 18:51:47 1989
***************
*** 30,38 ****
--- 30,40 ----
import int /* boolean variables */
also_cross_postings,
also_subgroups,
+ auto_preview_mode,
compress_mode,
conf_append,
conf_auto_quit,
+ conf_create,
conf_dont_sleep,
conf_group_entry,
delay_redraw,
***************
*** 104,109 ****
--- 106,112 ----
char **var_addr;
} variables[] = {
"also-subgroups", V_BOOLEAN | V_INIT, 0, (char **)&also_subgroups,
+ "auto-preview-mode",V_BOOLEAN, 0, (char **)&auto_preview_mode,
"backup", V_BOOLEAN | V_INIT, 0, (char **)&keep_rc_backup,
"collapse-subject", V_INTEGER, 3, (char **)&collapse_subject,
"columns", V_INTEGER, 1, (char **)&Columns,
***************
*** 112,117 ****
--- 115,121 ----
"compress", V_BOOLEAN, 0, (char **)&compress_mode,
"confirm-append", V_BOOLEAN, 0, (char **)&conf_append,
"confirm-auto-quit",V_BOOLEAN, 0, (char **)&conf_auto_quit,
+ "confirm-create", V_BOOLEAN, 0, (char **)&conf_create,
"confirm-entry", V_BOOLEAN, 0, (char **)&conf_group_entry,
"confirm-messages", V_BOOLEAN, 0, (char **)&conf_dont_sleep,
"cross-filter-seq", V_BOOLEAN, 0, (char **)&seq_cross_filtering,
***************
*** 138,144 ****
"lines", V_INTEGER, 1, (char **)&Lines,
"long-menu", V_BOOLEAN, 1, (char **)&long_menu,
"macro-debug", V_BOOLEAN, 0, (char **)¯o_debug,
! "mail", V_STRING, 0, (char **)&mail_box,
"mail-format", V_BOOLEAN, 0, (char **)&use_mail_folders,
"mail-header", V_STRING, 0, (char **)&extra_mail_headers,
"mail-record", V_STRING, 2, (char **)&mail_record,
--- 142,148 ----
"lines", V_INTEGER, 1, (char **)&Lines,
"long-menu", V_BOOLEAN, 1, (char **)&long_menu,
"macro-debug", V_BOOLEAN, 0, (char **)¯o_debug,
! "mail", V_STRING, 2, (char **)&mail_box,
"mail-format", V_BOOLEAN, 0, (char **)&use_mail_folders,
"mail-header", V_STRING, 0, (char **)&extra_mail_headers,
"mail-record", V_STRING, 2, (char **)&mail_record,
***************
*** 226,231 ****
--- 230,236 ----
if (strncmp(variable, "no", 2) == 0) {
on = !on;
variable += 2;
+ if (variable[0] == '-') variable++;
}
if ((var = lookup_variable(variable)) == NULL)
***************
*** 262,269 ****
case 2:
if (on) {
adjust(val_string);
! if (val_string) STR_VAR = home_relative(val_string);
} else
STR_VAR = (char *)NULL;
break;
--- 267,279 ----
case 2:
if (on) {
+ char exp_buf[FILENAME];
+
adjust(val_string);
! if (val_string) {
! if (expand_file_name(exp_buf, val_string))
! STR_VAR = home_relative(exp_buf);
! }
} else
STR_VAR = (char *)NULL;
break;
***************
*** 280,285 ****
--- 290,297 ----
case V_BOOLEAN:
+ if (val_string) on = strncmp(val_string, "off", 3);
+
switch (var->var_op) {
case 0:
BOOL_VAR = on;
***************
*** 367,373 ****
disp_variables()
{
! char *str, *key_name();
int i, b;
register struct variable_defs *var;
--- 379,385 ----
disp_variables()
{
! char *str, *key_name(), *pushed;
int i, b;
register struct variable_defs *var;
***************
*** 380,392 ****
so_printf("\1Variable settings:\1");
for (var = variables; var < &variables[TABLE_SIZE]; var++) {
switch (VAR_TYPE) {
case V_STRING:
str = (var->var_op == 1) ? CBUF_VAR : STR_VAR;
! if (str == NULL || *str == NUL) break;
if (pg_next() < 0) goto out;
! printf("%-20.20s = \"%s\"\n", var->var_name, str);
break;
case V_BOOLEAN:
--- 392,405 ----
so_printf("\1Variable settings:\1");
for (var = variables; var < &variables[TABLE_SIZE]; var++) {
+ pushed = var_on_stack(var) ? ">" : " ";
switch (VAR_TYPE) {
case V_STRING:
str = (var->var_op == 1) ? CBUF_VAR : STR_VAR;
! if (str == NULL) str = "";
if (pg_next() < 0) goto out;
! printf("%s %-20.20s = \"%s\"\n", pushed, var->var_name, str);
break;
case V_BOOLEAN:
***************
*** 393,410 ****
if (pg_next() < 0) goto out;
b = BOOL_VAR;
if (var->var_op == 2 || var->var_op == 4) b = !b;
! printf("%s%s\n", b ? "" : "no ", var->var_name);
break;
case V_INTEGER:
i = INT_VAR;
if (pg_next() < 0) goto out;
! printf("%-20.20s = %d\n", var->var_name, i);
break;
case V_KEY:
if (pg_next() < 0) goto out;
! printf("%-20.20s = %s\n", var->var_name, key_name(KEY_VAR));
break;
case V_SPECIAL:
--- 406,423 ----
if (pg_next() < 0) goto out;
b = BOOL_VAR;
if (var->var_op == 2 || var->var_op == 4) b = !b;
! printf("%s %-20.20s %s\n", pushed, var->var_name, b ? "" : "= off");
break;
case V_INTEGER:
i = INT_VAR;
if (pg_next() < 0) goto out;
! printf("%s %-20.20s = %d\n", pushed, var->var_name, i);
break;
case V_KEY:
if (pg_next() < 0) goto out;
! printf("%s %-20.20s = %s\n", pushed, var->var_name, key_name(KEY_VAR));
break;
case V_SPECIAL:
***************
*** 414,420 ****
case 2:
if (also_read_articles) {
if (pg_next() < 0) goto out;
! printf("%-20.20s = %d\n", var->var_name, article_limit);
}
break;
}
--- 427,433 ----
case 2:
if (also_read_articles) {
if (pg_next() < 0) goto out;
! printf("%s %-20.20s = %d\n", pushed, var->var_name, article_limit);
}
break;
}
***************
*** 501,506 ****
--- 514,524 ----
head = path;
tail = path + index;
while (*head && isspace(*head)) head++;
+ if (strncmp(head, "no", 2) == 0) {
+ head += 2;
+ if (*head == '-') head++;
+ }
+
help_var = var = variables;
len = tail - head;
***************
*** 542,544 ****
--- 560,714 ----
return 0;
}
+ static struct var_stack {
+ struct var_stack *next;
+ struct variable_defs *v;
+ union {
+ int ivar;
+ int bool;
+ char key;
+ char *str;
+ } value;
+ } *var_stack = NULL, *vs_pool = NULL;
+
+ mark_var_stack()
+ {
+ register struct var_stack *vs;
+
+ if (vs_pool) {
+ vs = vs_pool;
+ vs_pool = vs->next;
+ } else {
+ vs = (struct var_stack *)calloc(1, sizeof(struct var_stack));
+ mem_check((char *)vs, 1, "var structure");
+ }
+ vs->next = var_stack;
+ var_stack = vs;
+ vs->v = NULL;
+ }
+
+ push_variable(variable)
+ char *variable;
+ {
+ register struct variable_defs *var;
+ register struct var_stack *vs;
+
+ if (strncmp(variable, "no", 2) == 0) {
+ variable += 2;
+ if (variable[0] == '-') variable++;
+ }
+
+ if ((var = lookup_variable(variable)) == NULL) {
+ msg("pushing unknown variable %s", variable);
+ return 0;
+ }
+
+ mark_var_stack();
+ vs = var_stack;
+ vs->v = var;
+
+ switch (VAR_TYPE) {
+
+ case V_STRING:
+
+ switch (var->var_op) {
+ case 0: /* if we update one of these variables, */
+ case 2: /* new storage will be allocated for it */
+ case 3: /* so it is ok just to save the pointer */
+ vs->value.str = STR_VAR;
+ break;
+
+ case 1: /* we free this memory when restored */
+ vs->value.str = copy_str(CBUF_VAR);
+ break;
+ }
+ break;
+
+ case V_BOOLEAN:
+ vs->value.bool = BOOL_VAR;
+ break;
+
+ case V_INTEGER:
+ vs->value.ivar = INT_VAR;
+ break;
+
+ case V_KEY:
+ vs->value.key = KEY_VAR;
+ break;
+
+ case V_SPECIAL:
+ msg("Cannot push pseudo variable %s", var->var_name);
+ break;
+ }
+
+ return 1;
+ }
+
+ restore_variables()
+ {
+ register struct variable_defs *var;
+ register struct var_stack *vs, *vs1;
+
+ vs = var_stack;
+
+ while (vs != NULL) {
+ if ((var = vs->v) == NULL) {
+ var_stack = vs->next;
+ vs->next = vs_pool;
+ vs_pool = vs;
+ return;
+ }
+
+ switch (VAR_TYPE) {
+
+ case V_STRING:
+ switch (var->var_op) {
+ case 0: /* only restore the string if changed; then we */
+ case 2: /* can also free the memory occupied by the */
+ case 3: /* 'new' value (if not NULL) */
+ if (STR_VAR != vs->value.str) {
+ if (STR_VAR != NULL) free(STR_VAR);
+ STR_VAR = vs->value.str;
+ }
+ break;
+
+ case 1: /* it fitted before, so it will fit againg */
+ strcpy(CBUF_VAR, vs->value.str);
+ free(vs->value.str);
+ break;
+ }
+ break;
+
+ case V_BOOLEAN:
+ BOOL_VAR = vs->value.bool;
+ break;
+
+ case V_INTEGER:
+ INT_VAR = vs->value.ivar;
+ break;
+
+ case V_KEY:
+ KEY_VAR = vs->value.key;
+ break;
+
+ case V_SPECIAL: /* these are not saved, so... */
+ break;
+ }
+
+ vs1 = vs->next;
+ vs->next = vs_pool;
+ vs_pool = vs;
+ vs = vs1;
+ }
+ var_stack = NULL;
+ }
+
+ static var_on_stack(var)
+ register struct variable_defs *var;
+ {
+ register struct var_stack *vs;
+
+ for (vs = var_stack; vs; vs = vs->next)
+ if (vs->v == var) return 1;
+ return 0;
+ }